package org.aeon.fasttasks.core.annotation;

import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 允许重复注释以达到多线程启动且每个线程都自身循环
 * <br>@LoopTask(async = true)
 * <br>@LoopTask(async = false)
 * <br>过多 LoopTask 优先拿第一个满足要求的，只有一种 async 则报错
 * <br>注意：每个并行线完成任务数量不确保一致（这和任务完成时间有关），但并行数和执行任务总数和配置相同
 *
 * @author aeon
 * @createTime 2025/08/08  16:02
 * @description 循环任务
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(LoopTaskPro.class)
public @interface LoopTask {

    /**
     * 循环次数
     * {@link #count()}
     *
     * @return
     */
    @AliasFor("count")
    int value() default 1;

    /**
     * 循环次数
     * {@link #value()}
     *
     * @return
     */
    @AliasFor("value")
    int count() default 1;

    /**
     * 循环间隔时间
     * 受线程池大小及任务时间影响，无法精确控制
     *
     * @return
     */
    long interval() default 0;

    /**
     * 时间单位
     *
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

    /**
     * 是否异步执行
     *
     * @return
     */
    boolean async() default false;

}
